哈囉,各位邦友們!
歷經從 Standalone 專案起手,走過服務、HTTP、Signals 與 @defer。
今天的目標,就是讓 Day01~Day26 打造的專案透過 ng build 打包,並部署到 GitHub Pages,正式對外公開。
ng build 產出可部署的靜態資源,理解基礎設定與常見參數。ngModel。這些讓專案結構清晰、依賴明確,是部署前檢視可維護性的第一步。resource() 與 @defer 應用到位,並在 Day26 總結時完成整體驗收。這意味著狀態管理與效能策略都已就緒,可以放心對外展示。ng build 打包生產版hero-journey),執行 npm install 或 npm ci,確保依賴完整。angular.json 可以看到以下片段:"build": {
    "builder": "@angular/build:application",
    "options": {
    "browser": "src/main.ts",
    "tsConfig": "tsconfig.app.json",
    "inlineStyleLanguage": "scss",
    "assets": [
        {
        "glob": "**/*",
        "input": "public"
        }
    ],
    "styles": [
        "src/styles.scss"
    ],
    "server": "src/main.server.ts",
    "outputMode": "server",
    "ssr": {
        "entry": "src/server.ts"
    }
    },
    "configurations": {
    "production": {
        "budgets": [
        {
            "type": "initial",
            "maximumWarning": "500kB",
            "maximumError": "1MB"
        },
        {
            "type": "anyComponentStyle",
            "maximumWarning": "4kB",
            "maximumError": "8kB"
        }
        ],
        "outputHashing": "all"
    },
    "development": {
        "optimization": false,
        "extractLicenses": false,
        "sourceMap": true
    }
    },
    "defaultConfiguration": "production"
}
預設為 SSR 專案(outputMode: "server"),代表 ng build 會輸出 dist/hero-journey/browser 與 dist/hero-journey/server。GitHub Pages 僅能托管靜態檔案,因此稍後要取用 browser 目錄內容。
baseHrefGitHub Pages 會把網站掛在 https://<使用者>.github.io/<repo>/,因此需要設定 baseHref 讓路由與資源路徑正確。
有兩種做法:
npx ng build --configuration production --output-mode=static --base-href "/hero-journey/"
angular.json 的 build.options 增加 "baseHref": "/hero-journey/",或建立 project.json 環境設定檔。小提示:如果你使用自己的 GitHub 仓庫,將
/hero-journey/替換成實際 repo 名稱即可。
靜態部署時,Angular 會依據 app.routes.server.ts 的設定產生預渲染路徑。為了避免 /detail/:id 在 GitHub Pages 重新整理時出現 404,我們新增以下設定,讓 CLI 在建置時替每位英雄產生對應的靜態頁面:
import { DEFAULT_HEROES } from './in-memory-data';
export const serverRoutes: ServerRoute[] = [
  {
    path: 'detail/:id',
    renderMode: RenderMode.Prerender,
    getPrerenderParams: async () =>
      DEFAULT_HEROES.map((h) => ({ id: String(h.id) })),
  },
  {
    path: '**',
    renderMode: RenderMode.Prerender,
  },
];
這段程式碼會迭代 DEFAULT_HEROES,並把每個 id 轉成字串傳給 getPrerenderParams。也因此我們將 DEFAULT_HEROES 於 src/app/in-memory-data.ts 匯出,讓同一份資料可供 SSR 與 API 模擬共用;未來若改成呼叫後端,只需在此改成抓取真實資料清單即可銜接。
npm run build -- --configuration production --output-mode browser --base-href "/hero-journey/"
npm run build 透過 CLI 執行 ng build。--configuration production 套用壓縮、tree-shaking 等最佳化。--output-mode=static 強制產出純前端資源,避免把 dist/.../server 誤傳到靜態主機。--base-href 確保靜態資源尋址正確。建置完成後會看到類似結果:
dist/hero-journey/
├── browser/
│   ├── index.html
│   ├── main-HASH.js
│   ├── styles-HASH.css
└── 3rdpartylicenses.txt
└── prerendered-routes.json
部署到 GitHub Pages 時,只需要 browser/ 目錄即可。若想預覽生產版,直接在本機啟動簡易伺服器:
npx http-server dist/hero-journey/browser -p 4200
hero-journey 推送至 GitHub。main 或 master) 已開啟 GitHub Actions。angular-cli-ghpages最簡單、快速的方式,適合個人專案。
npm install angular-cli-ghpages --save-dev
npm run build -- --configuration production --output-mode=static --base-href "/hero-journey/"
npx angular-cli-ghpages --dir=dist/hero-journey/browser
gh-pages 分支並推送至遠端。Deploy from a branch 並指向 gh-pages。https://<使用者>.github.io/hero-journey/ 造訪。適合團隊合作或常態發佈。
在專案根目錄新增 .github/workflows/deploy.yml:
name: Deploy Angular to GitHub Pages
on:
  push:
    branches:
      - main
  workflow_dispatch: {}
jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    permissions:
      contents: write
      pages: write
      id-token: write
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
      - name: Install dependencies
        run: npm ci
        working-directory: projects/hero-journey
      - name: Build browser bundle
        run: npm run build -- --configuration production --output-mode=static --base-href "/hero-journey/"
        working-directory: projects/hero-journey
      - name: Upload artifact
        uses: actions/upload-pages-artifact@v3
        with:
          path: projects/hero-journey/dist/hero-journey/browser
      - name: Deploy to GitHub Pages
        uses: actions/deploy-pages@v4
首次執行後,GitHub 會自動建立 github-pages 環境並指向最新部署結果。你只需要把程式碼推到 main,部署就交給 CI。
baseHref 與 redirect 設定是否正確。@defer 或懶載入,於 GitHub Pages 上再檢查一次觸發條件是否正常。部署到 GitHub Pages 是最容易入門的方式,但在實務專案中,我們常需要 SSL、後端 API、版本管理或自動回滾。以下提供三條進階道路:
npm install -g firebase-tools → firebase login → firebase init hosting → 指定 dist/hero-journey/browser → firebase deploy。npm run build -- --output-mode=static 與 Output dist/hero-journey/browser → 一鍵部署。npm run build -- --output-mode=static、Publish Directory dist/hero-journey/browser → 啟用自動部署。建議依專案需求挑選平台,並持續將部署腳本自動化,避免手動操作造成遺漏。
baseHref 或 deploy-url 設定錯誤。記得清理瀏覽器快取或使用 DevTools 檢查資源載入路徑。dist/hero-journey/browser 內複製一份 index.html 為 404.html,或善用 angular-cli-ghpages 自動處理。npm ci,確保 Angular CLI 能正確運作。browser 目錄,避免多餘檔案增加下載量。今日小結:
今天我們正式開啟把專案部署上線。透過 ng build 掌握打包流程、搞定 baseHref 與靜態資源路徑,再善用 GitHub Pages 或雲端平台,就能讓 Day01~Day26 的成果與更多人分享。